package cn.yinyu.queue.module.ecg.dal.mysql.appointment;

import cn.yinyu.queue.framework.common.pojo.PageResult;
import cn.yinyu.queue.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.yinyu.queue.framework.mybatis.core.mapper.BaseMapperX;
import cn.yinyu.queue.module.ecg.dal.dataobject.appointment.AppointmentDO;
import org.apache.ibatis.annotations.Mapper;
import cn.yinyu.queue.module.ecg.controller.admin.appointment.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDate;
import java.util.List;

/**
 * 预约 Mapper
 *
 * @author 马剑波
 */
@Mapper
public interface AppointmentMapper extends BaseMapperX<AppointmentDO> {

    default PageResult<AppointmentDO> selectPage(AppointmentPageReqVO reqVO) {

        return selectPage(reqVO, new LambdaQueryWrapperX<AppointmentDO>()
                .eqIfPresent(AppointmentDO::getApplyNo, reqVO.getApplyNo())
                .eqIfPresent(AppointmentDO::getEpisodeId, reqVO.getEpisodeId())
                .eqIfPresent(AppointmentDO::getPatId, reqVO.getPatId())
                .likeIfPresent(AppointmentDO::getPatName, reqVO.getPatName())
                .eqIfPresent(AppointmentDO::getPatGender, reqVO.getPatGender())
                .eqIfPresent(AppointmentDO::getPatBirthday, reqVO.getPatBirthday())
                .eqIfPresent(AppointmentDO::getPatMobile, reqVO.getPatMobile())
                .eqIfPresent(AppointmentDO::getPatPhone, reqVO.getPatPhone())
                .eqIfPresent(AppointmentDO::getPatIdentityId, reqVO.getPatIdentityId())
                .eqIfPresent(AppointmentDO::getPatAddr, reqVO.getPatAddr())
                .eqIfPresent(AppointmentDO::getPatDeptCode, reqVO.getPatDeptCode())
                .eqIfPresent(AppointmentDO::getPatDeptDesc, reqVO.getPatDeptDesc())
                .eqIfPresent(AppointmentDO::getPatWardCode, reqVO.getPatWardCode())
                .eqIfPresent(AppointmentDO::getPatWardDesc, reqVO.getPatWardDesc())
                .eqIfPresent(AppointmentDO::getPatBedNo, reqVO.getPatBedNo())
                .eqIfPresent(AppointmentDO::getBookDate, reqVO.getBookDate())
                .eqIfPresent(AppointmentDO::getBookTimeslot, reqVO.getBookTimeslot())
                .betweenIfPresent(AppointmentDO::getBookTime, reqVO.getBookTime())
                .eqIfPresent(AppointmentDO::getBookCheckType, reqVO.getBookCheckType())
                .eqIfPresent(AppointmentDO::getBookSrc, reqVO.getBookSrc())
                .orderByDesc(AppointmentDO::getId));
    }

/*
    @Select("select * from yy_queue.appointment where pat_id = #{patId} and to_days(book_date) = to_days(Now())")
    List<AppointmentDO> getCurrentPatId(@Param("patId") String patId);
*/

    @Select("select * from yy_queue.appointment where pat_id = #{patId} and book_check_type = #{checkType} and to_days(book_date) = to_days(Now()) limit 1")
    AppointmentDO getCurrentByPatAndCheckType(@Param("patId") String patId, @Param("checkType") Integer checkType);

    @Select("select * from yy_queue.appointment where pat_id = #{patId} and book_check_type = #{checkType} and to_days(book_date) = to_days(#{book_date}) limit 1")
    AppointmentDO getByPatAndCheckTypeAndBookDate(@Param("patId") String patId, @Param("checkType") Integer checkType, @Param("book_date") LocalDate book_date);

    @Select("select * from yy_queue.appointment where episode_id = #{episodeId} and apply_no = #{applyNo} limit 1")
    AppointmentDO getByEpisodeIdAndApplyNo(@Param("episodeId") String episodeId, @Param("applyNo") String applyNo);
}

